#define TA_FAIL 0x01
#define TA_SUCCESS 0x00

// 函数名：Api_HandShakeFgpModule
// 功能：该函数用于与指纹模块进行握手通信
// 参数：timeov - 超时时间，单位为毫秒
// 返回值：返回TA_SUCCESS表示握手成功，返回负值表示握手失败
int16 Api_HandShakeFgpModule(uint32 timeov)
{
    int32 time; // 定义变量time，用于记录剩余的等待时间
    int16 result = TA_FAIL; // 定义变量result，用于记录通信结果，初始值设为TA_FAIL
    uint8 cmd_buf[8], data_buf[8]; // 定义发送命令缓冲区cmd_buf和接收数据缓冲区data_buf
    time = timeov; // 将超时时间赋值给time

    // 生成握手的第一个命令，命令类型为0xFE
    Make_OneCmd(cmd_buf, 0xfe, 0, 0);

    // 在规定的超时时间内，不断尝试发送命令，直到获取到有效反馈
    while (time > 0)
    {
        // 发送生成的命令（命令缓冲区长度为8字节），每次发送间隔为10ms
        Api_Send_Data(cmd_buf, 8, 0);

        // 尝试获取模块的反馈，每次超时时间为10ms
        result = Api_GetCommand(data_buf, 10);

        // 如果获取到成功的反馈，退出循环
        if (result == TA_SUCCESS)
            break;

        // 若没有收到反馈，则等待10ms后再尝试
        time -= 10;
    }

    // 如果在超时时间内没有成功握手，返回失败状态码
    if (result != TA_SUCCESS)
        return -result;

    // 第一个命令已成功返回，清空底层缓冲区
    Api_Clr_Buf();

    // 生成第二个握手命令，命令类型为0xFD
    Make_OneCmd(cmd_buf, 0xfd, 0, 0);

    // 发送第二个握手命令
    Api_Send_Data(cmd_buf, 8, 0);

    // 设置等待时间为30ms
    time = 30;

    // 循环等待反馈
    while (time--)
    {
        // 每隔1ms检查一次反馈
        result = Api_GetCommand(data_buf, 1);

        // 如果获取到反馈且符合预期的命令类型与结果，则退出循环
        if (result == TA_SUCCESS && data_buf[1] == 0xfd && data_buf[4] == TA_FAIL)
            break;
    }

    // 如果在循环内成功握手，返回TA_SUCCESS，否则返回TA_FAIL
    if (time)
        return TA_SUCCESS;
    else
        return TA_FAIL;
}
